-- KEYS[1]: 限流 key
-- ARGV[1]: 桶容量
-- ARGV[2]: 漏水速率 (请求/秒)
-- ARGV[3]: 当前时间戳 (毫秒)

local key = KEYS[1]
local capacity = tonumber(ARGV[1])
local leakRate = tonumber(ARGV[2])
local now = tonumber(ARGV[3])

-- 获取当前水量和上次漏水时间
local bucket = redis.call('HMGET', key, 'current', 'lastTime')
local current = tonumber(bucket[1]) or 0
local lastTime = tonumber(bucket[2]) or now

-- 计算漏水量
local elapsed = math.max(0, (now - lastTime) / 1000)
local leaked = elapsed * leakRate

-- 更新水量（拒绝时也更新）
current = math.max(0, current - leaked)
if current < capacity then
    current = current + 1
    redis.call('HMSET', key, 'current', current, 'lastTime', now)
    return 1  -- 允许请求
else
    redis.call('HMSET', key, 'current', current, 'lastTime', now)
    return 0  -- 拒绝请求
end